#!/usr/bin/env python
#-*- coding: utf-8 -*-

# @autor: Elísio Gonçalves Gomes Ribeiro
# @curso: Engenharia Informática 3ºano nº4708
# @subject: Estrutura de Dados e Algoritmo
# @@version: 1.0.0 2012/2013
# @google-code: https://code.google.com/p/eda12134708/

###############################################################################
#
#
#

#------------------------------------------------------------------------------

import os
import string
import csv

class OPFile:
    def __init__(self):
        self.fname = ""
        self.extn = ""
        self.def_dir = "test/"
        self.error = ""
        self.data = None
        self.head_file = ""
        pass
    pass
    
    def read_file_in(self, fname):
        """verifica a extensão do ficheiro e 
        de acordo com o ficheiro indicado tenta 
        ler o conteudo pre-formatado de cada tipo
        e retorna uma lista ddos dados lidos 
        """
        fname = self.def_dir + fname
        try:
            if (self.__fileExist(fname) and self.__check_ext(fname)):
                extn = fname[-4:]
                if (extn == '.csv'):
                    print fname
                    self.__read_csv_file(fname)
                else:
                    print fname
                    self.__read_txt_file(fname)
                pass
                self.head_file = self.data.keys()
            else:
                raise IOError
            pass
        except: raise
    pass
    
    def __check_ext(self, fname):
        """verifica se e um txt ou um csv
        e separa nome o caminho e a extensão do ficheeiro
        para as respectivas variaveis
        """
        extn = fname[-4:]
        if ((extn == '.csv') or (extn == '.txt')):
            self.extn = extn
            return 1
        else:
            return 0
        pass
    pass

    # metodo para guardar os dados num ficheiro csv
    def __write_csv_file(fname, col_names, lst_data):
        ''' recebe o nome de um ficheiro e uma lista de dados em forma de tuplos
        e gurda esses dados num ficheiro com extensão .csv
            
            nm_ficheiro - nome do ficheiro CSV onde guardar os dados
            nms_colunas - nomes para cada coluna de dados
            lst_dados - lista de tuplos a escrever no ficheiro
        '''
        fname = self.def_dir + fname
        try:
            lst_data = utf_8_encoder(lst_data)
            writer = csv.writer(open(fname, "wb"))
        except:
            pass
        else:
            writer.writerow(col_names)
            writer.writerows(lst_data)
        pass
    pass
    
    # metodo para guardar os dados num ficheiro csv
    def __read_csv_file(self, fname):
        ''' recebe o nome de um ficheiro e uma lista de dados em forma de tuplos
        e gurda esses dados num ficheiro com extensão .csv
            
            fname - nome do ficheiro CSV onde guardar os dados
        '''
        try:
            csv_file = open(fname, "rb")
            r_file = csv.DictReader(csv_file)
            self.data = {}
            for elem in r_file:
                for key_v in elem.keys():
                    if (key_v not in self.data.keys()):
                        self.data[key_v] = [elem[key_v]]
                    else:
                        self.data[key_v].append(elem[key_v])
                    pass
                pass
            pass
        except: raise        
    pass
    
    # 
    def __read_txt_file(self, fname, sep='-'):
        try:
            r_file = open(fname, "rb")
            r_lines = r_file.readlines()
            self.head_file = r_lines.pop(0)
        except: raise
        finally:
            r_file.close()
            self.data = self.__split_line(r_lines, sep)
        pass
    pass
    
    # 
    def save_file(self, fname, data_lst):
        fname = self.def_dir+fname
        try:
            w_file = open(fname, "wb+")
            w_file.write(data_lst[0])
            for row in data_lst[1:]:
                w_file.write('\n')
                w_file.write(str(row))                
            pass
        except: raise
        finally:
            w_file.close()
        pass
    pass    
    
    def __split_line(self, lst_lines, sep):
        keys = self.head_file.split(sep)
        keys = [val.strip() for val in keys]
        tmp_d = {}
        for line in lst_lines:
            ln = line.split(sep)
            ln = [l.strip() for l in ln]
            j=0
            for k in keys:
                if (k not in tmp_d.keys()):
                    tmp_d[k] = [ln[j]]
                    j +=1
                else:
                    tmp_d[k].append(ln[j])
                    j +=1
                pass
            pass
        pass
        return tmp_d
    pass
        
    #codificando os dados
    def utf_8_encoder(self,lista):
        '''codifica a informação em utf8 e retorna-os numa lista'''
        r_lst = []
        for v in lista:
            r_lst.append(v.decode("utf8"))
        pass
        return r_lst
    pass
    
    #verificar se o ficheiro no caminho dado ja existe
    def __fileExist(self,fname):
        return os.access(fname, os.F_OK)
    pass
pass

